<?php
/**
 * Classe que usa o padrão Data Access Object para criar, ler, atualizar e deletar no banco de dados objetos do tipo Inscricao
 * @name InscricaoDAO
 * @author Fabio Cezar Baía baiacfabio@gmail.com
 * @since 13/06/2013 15:52:51
 */
class InscricaoDAO extends DAO{


	/**
	 * Persiste uma nova Inscricao no banco de dados ou atualiza caso ja exista
	 * @access public
	 * @name save
	 * @param Inscricao $inscricao
	 * @since 24/04/2013 21:28:26
	 */
	public function save( Inscricao $inscricao ) {

		if($inscricao->getId() == ""){
			$this->insert($inscricao);
		}else{
			$this->update($inscricao);
		}

	}

	/**
	 * Insere um novo Inscricao no banco de dados
	 * @access private
	 * @name insert
	 * @param Inscricao $inscricao
	 * @since 13/06/2013 15:53:21
	 */
	private function insert(Inscricao $inscricao) {

		try{
			$stmt = $this->db->prepare("INSERT INTO `{$this->entity}` (participante_id, evento_id, dataInscricao, percentagemParticipacao) VALUES (?, ?, ?, ?)");
			$stmt->bindValue(1, $inscricao->getParticipante()->getId() );
			$stmt->bindValue(2, $inscricao->getEvento()->getId() );
			$stmt->bindValue(3, $inscricao->getDataInscricao()->format("Y-m-d H:i:s") );
			$stmt->bindValue(4, $inscricao->getPercentagemParticipacao() );
			$stmt->execute();
				
			//pega o id inserido
			$lastId = $this->db->lastInsertId();
				
			//insere registros na tabela N to N
			$atividades = $inscricao->getAtividades();
			$pos = 0;
			$valores = "";
			foreach($atividades as $atividade){
				if($pos == 0){
					$valores .= "(".$lastId.", ".$atividade->getId().")";
				}else{
					$valores .= ", (".$lastId.", ".$atividade->getId().")";
				}
				$pos++;
			}
			$stmt = $this->db->prepare("INSERT INTO `eacad_inscricao_atividade` (inscricao_id, atividade_id) VALUES ".$valores."");
			$stmt->execute();
			//
				
				
				
			//SystemMessage::createMessage("Inscricao cadastrado com sucesso!", SystemMessage::TYPE_SUCCESS);
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
	}

	/**
	 * Atualiza um Inscricao no banco de dados
	 * @access private
	 * @name update
	 * @param Inscricao $inscricao
	 * @since 24/04/2013 21:37:31
	 */
	private function update(Inscricao $inscricao) {

		try{
			$stmt = $this->db->prepare("UPDATE `{$this->entity}` set participante_id = ?, evento_id = ?, dataInscricao= ?, percentagemParticipacao = ? WHERE id = ?");
			$stmt->bindValue(1, $inscricao->getParticipante()->getId() );
			$stmt->bindValue(2, $inscricao->getEvento()->getId() );
			$stmt->bindValue(3, $inscricao->getDataInscricao()->format("Y-m-d H:i:s") );
			$stmt->bindValue(4, $inscricao->getPercentagemParticipacao() );
			$stmt->bindValue(5, $inscricao->getId() );
				
			//SystemMessage::createMessage("Inscricao atualizado com sucesso!", SystemMessage::TYPE_SUCCESS);
				
			$stmt->execute();
			// fecho a conexão
			$this->db = null;
				
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}

	}

	/**
	 * Obtem um Inscricao do banco com base no id
	 * @access public
	 * @name get
	 * @param int $id Id do Inscricao a ser obtido
	 * @since 24/04/2013 21:42:12
	 * @return Inscricao
	 */
	public function get($id) {
		$inscricao = new Inscricao();

		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
			$stmt->execute();
				
			$obj = $stmt->fetchObject();
			$inscricao->setId($obj->id);
				
			$participanteDAO = new ParticipanteDAO();
			$inscricao->setParticipante($participanteDAO->get($obj->participante_id));
				
			$eventoDAO = new EventoDAO();
			$inscricao->setEvento($eventoDAO->get($obj->evento_id));
				
			$inscricao->setDataInscricao($obj->dataInscricao);
			$inscricao->setPercentagemParticipacao($obj->percentagemParticipacao);
				
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}

		return $inscricao;
	}

	/**
	 * Lista todos os Inscricaos do banco
	 * @access public
	 * @name listAll
	 * @since 24/04/2013 01:13:22
	 * @return array Array de Inscricaos
	 */
	public function listAll() {
		$lista = array();

		try{
			$stmt = $this->db->prepare("SELECT * FROM `{$this->entity}`");
			$stmt->execute();
				
			while ($obj = $stmt->fetch(PDO::FETCH_OBJ, PDO::FETCH_ORI_NEXT)) {
				$inscricao = new Inscricao();
				$inscricao->setId($obj->id);
					
				$participanteDAO = new ParticipanteDAO();
				$inscricao->setParticipante($participanteDAO->get($obj->participante_id));

				$eventoDAO = new EventoDAO();
				$inscricao->setEvento($eventoDAO->get($obj->evento_id));

				$inscricao->setDataInscricao($obj->dataInscricao);
				$inscricao->setPercentagemParticipacao($obj->percentagemParticipacao);

				$lista[] = $inscricao;
			}
				
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			echo "Erro: ".$ex->getMessage();
		}

		return $lista;
	}

	/**
	 * @access public
	 * @name listaPresenca
	 * @param $evento, $atividade
	 * @since 13/06/2013 19:22:20
	 */
	public function listaPresenca($eventoAtivo, $atividadeId) {
		$lista = array();

		if($atividadeId != ""){
			$query = "SELECT i.id as id_inscricao, i.dataInscricao,
					p.id as id_participante, p.nome, p.rg, p.cpf,
					a.id as id_atividade, a.nome as nome_atividade, a.descricao as descricao_atividade, a.valor, a.cargaHoraria
					FROM inscricao i, participante p, atividade a
					WHERE i.evento_id = '".$eventoAtivo->getId()."' AND i.participante_id = p.id AND a.evento_id = i.evento_id AND a.id = '".$atividadeId."'";
		}else{
			$query = "SELECT i.id as id_inscricao, i.dataInscricao,
					p.nome, p.rg, p.cpf,
					a.nome as nome_atividade, a.descricao as descricao_atividade, a.valor, a.cargaHoraria
					FROM inscricao i, participante p, atividade a
					WHERE i.evento_id = '".$eventoAtivo->getId()."' AND i.participante_id = p.id AND a.evento_id = i.evento_id";
		}

		$result = mysql_query($query);

		while($dados = mysql_fetch_assoc($result)){
			$inscricao = new Inscricao();
			$participante = new Participante();
			$atividade = new Atividade();

			//$participante->setNome($dados["nome"]);
			//$participante->setRG($dados["rg"]);
			//$participante->setCPF($dados["cpf"]);
			$participanteDAO = new ParticipanteDAO();
			$participante = $participanteDAO->get($dados["id_participante"]);
				
			//$atividade->setNome($dados["nome_atividade"]);
			//$atividade->setDescricao($dados["descricao_atividade"]);
			//$atividade->setValor($dados["valor"]);
			//$atividade->setCargaHoraria($dados["cargaHoraria"]);
			$atividadeDAO = new AtividadeDAO();
			$atividade = $atividadeDAO->get($dados["id_atividade"]);
				
				
				
			$inscricao->setEvento($entityManager->find("Evento", $eventoAtivo->getId()));
			$inscricao->setParticipante($participante);
				
		}

	}


	/**
	 * Remove um Inscricao do banco com base no id
	 * @access public
	 * @name delete
	 * @param int $id Id do Inscricao a ser deletado
	 * @since 24/04/2013 21:52:32
	 */
	public function delete($id) {
		try{
			$stmt = $this->db->prepare("DELETE FROM `{$this->entity}` WHERE id = ?");
			$stmt->bindValue(1, $id, PDO::PARAM_INT);
				
				
			if($stmt->execute()){
				SystemMessage::createMessage("Inscricao removido com sucesso!", SystemMessage::TYPE_SUCCESS);
			}else{
				SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR);
			}
				
				
			// fecho a conexão
			$this->db = null;
			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}

	}

	/**
	 * @access public
	 * @name gravaListaPresenca
	 * @param $idAtividade, $idsInscricao
	 * @since 16/07/2013 20:15:29
	 */
	public function gravaListaPresenca($idAtividade, $idsInscricao) {
		try{
			//primeiro desmarca todos
			$stmt = $this->db->prepare("UPDATE `eacad_inscricao_atividade` set participou = ? WHERE atividade_id = ?");
			$stmt->bindValue(1, 0 );
			$stmt->bindValue(2, $idAtividade );
			$stmt->execute();

			//depois atualizar pra fazer update numa linha só
			if( sizeof( $idsInscricao ) > 0 ){
				foreach($idsInscricao as $idInscricao){
					$stmt = $this->db->prepare("UPDATE `eacad_inscricao_atividade` set participou = ? WHERE inscricao_id = ? AND atividade_id = ?");
					$stmt->bindValue(1, 1 );
					$stmt->bindValue(2, $idInscricao );
					$stmt->bindValue(3, $idAtividade );
						
					$stmt->execute();
				}
			}

			// fecho a conexão
			$this->db = null;

			// caso ocorra um erro, retorna o erro;
		}catch ( PDOException $ex ){
			//SystemMessage::createMessage("Um erro ocorreu! Não foi possível concluir a operação.", SystemMessage::TYPE_ERROR, $ex->getMessage());
		}
	}

}


